home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / HELLSRC.ZIP / GSP669.ASM < prev    next >
Assembly Source File  |  1993-10-16  |  9KB  |  292 lines

  1. ; Simple 669 playback routine using 'gs' lowlevel GUS routines.
  2.  
  3.         .386p
  4. code32  segment para public use32
  5.         assume cs:code32, ds:code32
  6.  
  7. include pmode.inc
  8. include gs.inc
  9.  
  10. public  ord
  11.  
  12. public  _muzloc, _muzend, _muzrow, _muzord, _muzloop, _muzeord
  13.  
  14. public  _gsp669_init, _gsp669_uninit, _gsp669_load, _gsp669_play, _gsp669_stop
  15.  
  16. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  17. ; DATA
  18. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  19. align 4
  20. ordptr          dd      ?               ; ptr to order list
  21. tempoptr        dd      ?               ; ptr to tempo list
  22. breakptr        dd      ?               ; ptr to break list
  23. patbaseptr      dd      ?               ; ptr to base of patterns
  24. instptr         dd      ?               ; ptr to sample data
  25.  
  26. currowptr       dd      ?               ; ptr to next row to play
  27.  
  28. _muzloc         label   word            ; ord:row                            |
  29. _muzrow         db      ?               ; current row playing                |
  30. _muzord         db      ?               ; current order playing              |
  31. _muzend         label   word            ; end:loop                          |
  32. _muzloop        db      ?               ; loop point of 669                 |
  33. _muzeord        db      ?               ; last+1 order of 669               |
  34.  
  35. panloc          db      0               ; base of ping-pong pan
  36. tempo           db      ?               ; tempo
  37. tempoc          db      ?               ; tempo counter                      |
  38. row             db      ?               ; current row                        |
  39. ord             db      ?               ; current order                      |
  40. break           db      ?               ; row of break                       |
  41.  
  42. pantbl          db      3,3,3,4,4,5,6,7,8,9,10,11,11,12,12,12
  43.                 db      12,12,12,11,11,10,9,8,7,6,5,4,4,3,3,3
  44.                 db      3,3,3,4,4,5,6,7,8,9,10,11,11,12,12,12
  45.                 db      12,12,12,11,11,10,9,8,7,6,5,4,4,3,3,3
  46.                 db      3,3,3,4,4,5,6,7,8,9,10,11,11,12,12,12
  47.                 db      12,12,12,11,11,10,9,8,7,6,5,4,4,3,3,3
  48.                 db      3,3,3,4,4,5,6,7,8,9,10,11,11,12,12,12
  49.                 db      12,12,12,11,11,10,9,8,7,6,5,4
  50. ;               db      0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  51. ;               db      15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
  52. ;               db      0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  53. ;               db      15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
  54. ;               db      0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  55. ;               db      15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
  56. ;               db      0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  57. ;               db      15,14,13,12,11,10,9,8,7,6,5,4
  58.  
  59. voltbl          db      004h,0a0h,0b0h,0c0h,0c8h,0d0h,0d8h,0e0h
  60.                 db      0e4h,0e8h,0ech,0f0h,0f2h,0f4h,0f6h,0f8h
  61.  
  62. freqtbl         dw      56,59,62,66,70,74,79,83,88,94,99,105
  63.                 dw      112,118,125,133,141,149,158,167,177,188,199,211
  64.                 dw      224,237,251,266,282,299,317,335,355,377,399,423
  65.                 dw      448,475,503,532,564,598,634,671,711,754,798,846
  66.                 dw      896,950,1006,1065,1129,1197,1268,1343,1423,1508,1597,1692
  67.  
  68. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  69. ; CODE
  70. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  71.  
  72. ;═════════════════════════════════════════════════════════════════════════════
  73. ; Main playback routine called by GUS IRQ routine
  74. mr:
  75.         mov al,tempoc
  76.         dec al
  77.         jnz mrd
  78.  
  79.         mov esi,currowptr
  80.         mov ax,word ptr row
  81.         inc al
  82.         cmp al,break
  83.         jbe short mrf0
  84.         xor al,al
  85.         inc ah
  86.         cmp ah,_muzeord
  87.         jbe short mrf1
  88.         mov ah,_muzloop
  89. mrf1:
  90.         movzx ebp,ah
  91.         mov edi,ordptr
  92.         movzx esi,byte ptr ds:[ebp+edi]
  93.         mov edi,tempoptr
  94.         mov bl,[edi+esi]
  95.         mov tempo,bl
  96.         mov edi,breakptr
  97.         mov bl,[edi+esi]
  98.         mov break,bl
  99.         lea esi,[esi*2+esi]
  100.         shl esi,9
  101.         add esi,patbaseptr
  102. mrf0:
  103.         mov word ptr row,ax
  104.         mov _muzloc,ax
  105.  
  106.         movzx edx,panloc
  107.         inc dl
  108.         and dl,3fh
  109.         mov panloc,dl
  110.         mov edi,instptr
  111.         mov ebp,7
  112. mrl0:
  113.         mov al,[esi+2]
  114.         mov ah,al
  115.         and al,0f0h
  116.         cmp al,50h
  117.         jne short mrl0f0
  118.         and ah,0fh
  119.         mov tempo,ah
  120. mrl0f0:
  121.         mov bl,pantbl[edx+ebp*4]
  122.         mov _vcpan[ebp],bl
  123.         or _vccmnd[ebp],2
  124.         mov ax,[esi]
  125.         cmp al,0feh
  126.         ja mrl0c
  127.         movzx ebx,ah
  128.         and bl,0fh
  129.         mov bl,voltbl[ebx]
  130.         mov _vcvol[ebp],bl
  131.         or _vccmnd[ebp],1
  132.         cmp al,0feh
  133.         je short mrl0c
  134.         xchg al,ah
  135.         shr ax,2
  136.         shr al,2
  137.         movzx ebx,ah
  138.         mov cx,freqtbl[ebx*2]
  139.         mov _vcfreq[ebp*2],cx
  140.         movzx ebx,al
  141.         lea ebx,[ebx*4+ebx]
  142.         lea ebx,[ebx*4+ebx]
  143.         mov al,[edi+ebx+12]
  144.         mov _vccntrl[ebp],al
  145.         mov eax,[edi+ebx+13]
  146.         mov _vcsbeg[ebp*4],eax
  147.         mov eax,[edi+ebx+17]
  148.         mov _vclbeg[ebp*4],eax
  149.         mov eax,[edi+ebx+21]
  150.         mov _vclend[ebp*4],eax
  151.         mov _vccmnd[ebp],8
  152. mrl0c:
  153.         add esi,3
  154.         sub ebp,1
  155.         jnc mrl0
  156.  
  157.         mov currowptr,esi
  158.         mov al,tempo
  159. mrd:
  160.         mov tempoc,al
  161.         ret
  162.  
  163. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  164. ; Init 669 player and low level gus crap
  165. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  166. _gsp669_init:
  167.         mov _gustimerfreq,9ch
  168.         mov _gusnumvoices,0cfh
  169.         call _gs_init
  170.         ret
  171.  
  172. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  173. ; Reset 669 player and low level gus crap
  174. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  175. _gsp669_uninit:
  176.         call _gsp669_stop
  177.         call _gs_uninit
  178.         ret
  179.  
  180. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  181. ; Load a 669, samples go directly into GUS ram
  182. ; In:
  183. ;   EAX -> stream input routine (In:ECX=len,EDX->buf, Out:EAX=len,CF=1 error)
  184. ;   EDX -> buffer large enough for all music data plus largest sample
  185. ; Out:
  186. ;   EAX - number of bytes of buffer to keep
  187. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  188. _gsp669_load:
  189.         pushad
  190.         mov ebp,edx
  191.         mov ecx,1f1h
  192.         call eax
  193.         mov al,[edx+70h]
  194.         mov _muzloop,al
  195.         lea eax,[edx+71h]
  196.         mov ordptr,eax
  197.         add eax,80h
  198.         mov tempoptr,eax
  199.         add eax,80h
  200.         mov breakptr,eax
  201.         add edx,ecx
  202.         mov instptr,edx
  203.         lea esi,[edx+13]
  204.         movzx edi,byte ptr [ebp+6eh]
  205.         imul ecx,edi,25
  206.         call dword ptr [esp+28]
  207.         add edx,ecx
  208.         mov patbaseptr,edx
  209.         movzx ecx,byte ptr [ebp+6fh]
  210.         lea ecx,[ecx*2+ecx]
  211.         shl ecx,9
  212.         call dword ptr [esp+28]
  213.         add edx,ecx
  214.         xor ebx,ebx
  215. gsp669loadl0:
  216.         mov ecx,[esi]
  217.         add esi,25
  218.         jecxz gsp669loadl0c
  219.         call dword ptr [esp+28]
  220.         push ecx
  221. gsp669loadl2:
  222.         xor byte ptr [edx],80h
  223.         inc edx
  224.         loop gsp669loadl2
  225.         pop ecx
  226.         sub edx,ecx
  227.         call _gs_putram
  228.         add ebx,ecx
  229. gsp669loadl0c:
  230.         dec edi
  231.         jnz gsp669loadl0
  232.         sub edx,[esp+20]
  233.         mov [esp+28],edx
  234.  
  235.         mov esi,instptr
  236.         movzx ecx,byte ptr [ebp+6eh]
  237.         xor ebx,ebx
  238. gsp669loadl1:
  239.         mov edx,[esi+13]
  240.         mov [esi+13],ebx
  241.         mov al,8
  242.         cmp edx,[esi+21]
  243.         jae short gsp669loadl1c
  244.         xor al,al
  245.         mov [esi+21],edx
  246. gsp669loadl1c:
  247.         add [esi+17],ebx
  248.         add [esi+21],ebx
  249.         dec dword ptr [esi+21]
  250.         mov [esi+12],al
  251.         add ebx,edx
  252.         add esi,25
  253.         loop gsp669loadl1
  254.  
  255.         popad
  256.         ret
  257.  
  258. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  259. ; Play a loaded 669
  260. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  261. _gsp669_play:
  262.         push ax ecx edi
  263.         call _gsp669_stop
  264.         mov edi,ordptr
  265.         mov ecx,80h
  266.         mov al,0ffh
  267.         repne scasb
  268.         sub cl,7eh
  269.         neg cl
  270.         mov _muzeord,cl
  271.         mov _muzloc,0
  272.         mov panloc,0
  273.         mov dword ptr tempoc,0ff0001h
  274.         mov _gusrout,offset mr
  275.         pop edi ecx ax
  276.         ret
  277.  
  278. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  279. ; Stop playback
  280. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  281. _gsp669_stop:
  282.         mov _gusrout,offset _ret
  283.         mov dword ptr _vcvol[0],4040404h
  284.         mov dword ptr _vcvol[4],4040404h
  285.         mov dword ptr _vccmnd[0],1010101h
  286.         mov dword ptr _vccmnd[4],1010101h
  287.         ret
  288.  
  289. code32  ends
  290.         end
  291.  
  292.